package calvin.study.redis.service.impl;

import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;

import calvin.study.middle.utils.RedisUtil;
import calvin.study.redis.config.RedisConstants;
import calvin.study.redis.service.IRedPacketService;

@Service
public class RedPacketService implements IRedPacketService {

	@Autowired
	private RedisUtil redisUtil;

	@Override
	public boolean sendRedPacket(String userId, Integer money, Integer nums) {
		try {
			// 生成微信群号
			String groupId = redisUtil.getSeqId();
			// 拆分红包
			Integer[] redPacket = this.splitRedPacket(money, nums);
			// 生成群对应的红包个数（数据结构）
			String redisKey = RedisConstants.REDIS_KEY_RED_PACKET + groupId;

			//以Hash结构， 生成发红包记录
			Map<String, Object> map = new HashMap<String, Object>();
			//map.put("groupId", groupId);
			map.put("money", money);
			map.put("redpackets", nums);
			redisUtil.hmSet(RedisConstants.REDIS_KEY_SEND_RED_PACKET_USER + userId + "_" + groupId, map);
			
			//将拆分红包已list数据结构进行存储
			return redisUtil.lSet(redisKey, Arrays.asList(redPacket),3600);
		} catch (Exception e) {
			throw new RuntimeException("发送红包失败");
		}
	}

	/**
	 * 
	 * @Title: splitRedPacket 
	 * @Description: 红包拆分 
	 * @date: 2022年1月25日下午6:19:02 
	 * @version: 
	 * @param money 金额 
	 * @param nums  拆分数量
	 * @return 
	 * @throws
	 */
	public Integer[] splitRedPacket(Integer money, Integer nums) {
		// 已使用的金额
		int use = 0;
		Integer[] array = new Integer[nums];
		Random random = new Random();
		for (int i = 0, len = nums; i < len; i++) {
			if (i == nums - 1) {// 最后一个红包
				array[i] = money - use;// 总金额 -已使用金额 = 最后一个红包金额
			} else {
				// 计算红包金额，平均分配
				int avg = (money - use) * 2 / (nums - i);
				// 生成红包随机金额
				array[i] = 1 + random.nextInt(avg - 1);
			}
			use = use + array[i];
		}
		// 返回拆分后的红包
		return array;
	}

	@Override
	public int getRedPacket(String userId, String groupId) {
		try {
			// 抢红包记录的key
			String getRedPacketRecord = RedisConstants.REDIS_KEY_GET_RED_PACKET + userId + "_" + groupId;
			// 红包群的key
			String redPacketGroup = RedisConstants.REDIS_KEY_RED_PACKET + groupId;

			// 1.判断该用户是否抢过该群红包
			Map<Object, Object> getRecord  = redisUtil.hmGet(getRedPacketRecord);
			if (!CollectionUtils.isEmpty(getRecord)) {
				throw new RuntimeException("你已经抢过红包啦");
			}
			
			long listSize = redisUtil.lGetListSize(redPacketGroup);
			if (listSize == 0) {
				throw new RuntimeException("红包抢完啦");
			}
			// 如果没抢过，则从拆分的红包中，随机抢红包
			// 如果红包的个数为单数，则从list集合左边取，如果是双数则从list集合右边取
			int getRedPacket = (int) redisUtil.lPop(redPacketGroup, (int) (listSize % 2));

			// 用户抢红包记录
			Map<String, Object> map = new HashMap<String, Object>();
			map.put("money", getRedPacket);
			redisUtil.hmSet(getRedPacketRecord, map);
			return getRedPacket;
		} catch (Exception e) {
			e.printStackTrace();
			throw e;
		}
		
	}

}
